﻿using System;
using System.Collections;
using System.Collections.Specialized;
using System.Linq.Expressions;
using Castle.MonoRail.Framework;

namespace Castle.MonoRail.ExtensionMethods {
	public interface IControllerExtensionsProvider {
		void RedirectToAction<T>(T c, Expression<Action<T>> action) where T : SmartDispatcherController;
		void RedirectToAction<T>(T c, Expression<Func<T, Action>> action) where T : Controller;
		void RedirectToAction<T>(T c, Expression<Func<T, Action>> action, IDictionary parameters) where T : Controller;
		void RedirectToAction<T>(T c, Expression<Func<T, Action>> action, NameValueCollection parameters) where T : Controller;
		void RedirectToAction<T, R>(T c, Expression<Func<T, Action<R>>> action) where T : Controller;
		void RedirectToAction<T, R, R2>(T c, Expression<Func<T, Action<R, R2>>> action) where T : Controller;
		void RedirectToAction<T, R, R2, R3>(T c, Expression<Func<T, Action<R, R2, R3>>> action) where T : Controller;
		void RedirectToAction<T, R, R2, R3, R4>(T c, Expression<Func<T, Action<R, R2, R3, R4>>> action) where T : Controller;
		void Redirect<T>(Controller c, string action) where T : Controller;
		void Redirect<T>(Controller c, string action, IDictionary parameters) where T : Controller;
		void Redirect<T>(Controller c, string action, NameValueCollection parameters) where T : Controller;
		void Redirect<T>(Controller c, Expression<Action<T>> action) where T : SmartDispatcherController;
		void Redirect<T>(Controller c, Expression<Func<T, Action>> action) where T : Controller;
		void Redirect<T>(Controller c, Expression<Func<T, Action>> action, IDictionary parameters) where T : Controller;
		void Redirect<T>(Controller c, Expression<Func<T, Action>> action, NameValueCollection parameters) where T : Controller;
		void Redirect<T, R>(Controller c, Expression<Func<T, Action<R>>> action) where T : Controller;
		void Redirect<T, R1, R2>(Controller c, Expression<Func<T, Action<R1, R2>>> action) where T : Controller;
		void Redirect<T, R1, R2, R3>(Controller c, Expression<Func<T, Action<R1, R2, R3>>> action) where T : Controller;
		void Redirect<T, R1, R2, R3, R4>(Controller c, Expression<Func<T, Action<R1, R2, R3, R4>>> action) where T : Controller;
		void RenderView<T>(Controller c, string name) where T : Controller;
		void RenderView<T>(Controller c, string name, string mimeType) where T : Controller;
		void RenderView<T>(Controller c, string name, bool skipLayout) where T : Controller;
		void RenderView<T>(Controller c, string name, bool skipLayout, string mimeType) where T : Controller;
	}
}